2004年06月24日
川俣晶の縁側ソフトウェア技術雑記 total 12839 count

VB.NETの標準モジュールで、標準モジュール名を使用しないアクセスが気に入らない場合の1アイデア

Written By: 川俣 晶連絡先

 biacさんが、[VB.NET] Module と Classにて、以下のように書いています。

モジュール名を省略できるという仕様は、 以前の VB との互換性のためだと思われます。 しかし、 この仕様は、 (OOP 云々とは関係無く) プログラムの見通しを悪くするだけのものに思えてなりません。

 この問題に対処する(かもしれない)方法を、無責任に3秒ほどで考えてみましたので(何の保証もできないが)以下に書いてみます。

 ちなみに、これは1つのアイデアに過ぎず、これが問題を解決するかどうかは全く保証できず不明であることを前もって宣言しておきます。(3秒の思いつきに多くを期待してはいけない)

これが問題だ! §

 ここでの問題は以下のようなコードが有効であることです。

Module test1

    Sub sample()

    End Sub

End Module

Module Module1

    Sub Main()

        sample()

    End Sub

End Module

 モジュール名のtest1を示すことなくメソッドsampleを呼び出すことができます。

ModuleはNamespaceでくくれ! §

 これを解決するために、「ModuleはNamespaceでくくれ!」という方法を考えてみました。

Namespace a              ←Namespaceでくくった!

    Module test1

        Sub sample()

        End Sub

    End Module

End Namespace

Module Module1

    Sub Main()

        sample()         ←エラーになる

        a.sample()

    End Sub

End Module

本来のNamespaceの使い方とバッティングしないか? §

 Namespaceはネストできるので、Namespaceブロック中に新たにNamespaceブロックを記述しても、ネストした名前空間になるだけで問題ありません。

考察 §

 よく考えてみると、本質的な機能性は、Moduleであっても、Namespaceであっても、さほど差がないことに気付きました。両者の役割は全くことなりますが、利用時に何かを限定する効能は共通していると言えます。その際、Moduleによる限定が甘いことが不満であるとすれば、Namespaceによる限定を試みても良いことになります。

 もし、Moduleという機能の本来意図したことが「言語にビルドインされているステートメントのように扱えるメソッド等をユーザー定義可能とする」ことにあるとすれば、Moduleの機能はそのまま残して、ネストしたNamespaceでModuleに対する固有名経由のアクセスを実現するのも悪くない選択ではないかと思い付きました。

余談 §

 というか、意図せずしてVB.NETの設計の深遠な部分に出会ってしまったかもしれません。

 ModuleとNamespaceの関係は、ClassとNamespaceの関係とは異なります。従って、JavaやC#でのクラスと名前空間に関する考察をそのまま適用できません。新たに、それが何かをじっくり考えてみる価値があるかもしれません。いや、大多数の人は、そんな風に思わないと思いますが、私が楽しみを見いだしたのだから、私はそれでOKなのです (笑

 これを読んでbiacさんは納得しないと思いますが、私は楽しいので、私的にはまったくOK! (極悪だなぁ~)